\documentclass[a4paper]{article}
\usepackage[affil-it]{authblk}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{ctex}
\usepackage{listings}
\usepackage{algorithm}
\usepackage{algpseudocode}
\usepackage{graphicx}
\usepackage{tikz}
\usetikzlibrary{positioning}
\usepackage{booktabs}
\usepackage{subcaption}

\usepackage{geometry}
\geometry{margin=1.5cm, vmargin={0pt,1cm}}
\setlength{\topmargin}{-0.5cm}
\setlength{\paperheight}{29.7cm}
\setlength{\textheight}{25.3cm}

\begin{document}
% =================================================
\title{Report}

\author{徐翊钧 3220101901
  \thanks{Electronic address: \texttt{3220101901@zju.deu.cn}}}
\affil{(Qiangji2201), Zhejiang University }

\maketitle

\ctexset{
    abstractname = {Abstract}
}

\begin{abstract}
  
\end{abstract}

% ============================================
\part{问题描述.}
本次项目作业我们的目标是分别使用LMM和RK求解形如$u' = f(u)$的常微分方程, 具体的方程是三体问题：
\begin{equation}
\left\{
\begin{aligned}
u'_1 &= u_4, \\
u'_2 &= u_5, \\
u'_3 &= u_6, \\
u'_4 &= 2u_5 + u_1 - \frac{\mu(u_1+\mu-1)}{(u_2^2+u_3^2+(u_1+\mu-1)^2)^{3/2}} \\
     &\quad - \frac{(1-\mu)(u_1+\mu)}{(u_2^2+u_3^2+(u_1+\mu)^2)^{3/2}}, \\
u'_5 &= -2u_4 + u_2 - \frac{\mu u_2}{(u_2^2+u_3^2+(u_1+\mu-1)^2)^{3/2}} \\
     &\quad - \frac{(1-\mu)u_2}{(u_2^2+u_3^2+(u_1+\mu)^2)^{3/2}}, \\
u'_6 &= - \frac{\mu u_3}{(u_2^2+u_3^2+(u_1+\mu-1)^2)^{3/2}} \\
     &\quad - \frac{(1-\mu)u_3}{(u_2^2+u_3^2+(u_1+\mu)^2)^{3/2}}.
\end{aligned}
\right.
\end{equation}

给定两个不同的初值可以求解出不同周期的轨迹.

% ===========================================
\part{初值问题求解器的类设计.}

\begin{figure}[htbp]
\centering
\begin{tikzpicture}[
  node distance=2cm and 4cm,
  base/.style={rectangle, draw, minimum width=1cm, minimum height=0.4cm, align=center},
  class/.style={base},
  level/.style={sibling distance=#1}
]
% 基类
\node[class] (ivpsolver) {IVPSolver};

% 一级继承 - 调整间距
\node[class, below left=2cm and 3.5cm of ivpsolver] (lmm) {LMM};
\node[class, below=2cm of ivpsolver] (rk) {RK};
\node[class, below right=2cm and 4cm of ivpsolver] (embrk) {Emb-RK};

\draw (ivpsolver) -- (lmm);
\draw (ivpsolver) -- (rk);
\draw (ivpsolver) -- (embrk);

% LMM子类 - 调整布局
\node[class, below left=1.5cm and 1.2cm of lmm] (ab) {Adam-Bashforth};
\node[class, below=1.5cm of lmm] (am) {Adam-Moulton};
\node[class, below right=1.5cm and 1cm of lmm] (bdf) {BDF};

\draw (lmm) -- (ab);
\draw (lmm) -- (am);
\draw (lmm) -- (bdf);

% RK子类 - 调整位置
\node[class, below left=1.5cm and 0.5cm of rk] (erk) {ERK};
\node[class, below right=1.5cm and 0.5cm of rk] (irk) {IRK};

\draw (rk) -- (erk);
\draw (rk) -- (irk);

% ERK子类
\node[class, below left=1.5cm and 0cm of erk] (crk) {Classical-4th-RK};
\draw (erk) -- (crk);

% IRK子类 - 调整间距
\node[class, below left=1.5cm and 0.2cm of irk] (esdirk) {ESDIRK};
\node[class, below right=1.5cm and 0.8cm of irk] (glrk) {Gauss-Legendre};

\draw (irk) -- (esdirk);
\draw (irk) -- (glrk);

% Emb-RK子类 - 调整位置
\node[class, below left=1.5cm and 0.2cm of embrk] (fehlberg) {Fehlberg};
\node[class, below right=1.5cm and 0cm of embrk] (dp) {Dormand-Prince};

\draw (embrk) -- (fehlberg);
\draw (embrk) -- (dp);

\end{tikzpicture}
\caption{初值问题求解器类继承关系图}
\label{fig:class-hierarchy}
\end{figure}

类的继承关系如图\ref{fig:class-hierarchy}所示, 其中IVPSolver是所有求解器的基类, 
其余的类都是从IVPSolver继承而来.
IVPSolver类中包含了求解器的基本信息, 以及求解器的基本接口, 例如初始化函数和求解函数.
solve函数在LMM, ERK, IRK, Emb-RK类中实现, 因为相同的方法具有统一的形式,
区别就是不同的系数. 所以我们在具体方法的类里存储不同的系数, 保证了相同类型求解方法的适用和复用.

% ===========================================
\part{实现细节.}
\section{线性多步法的多步初值生成}

线性多步法（Linear Multistep Methods, LMM）的一个关键挑战是：它需要多个连续时间点的解值才能开始计算。而初值问题通常只提供了初始时刻的一个值。因此，需要一种方法来生成这些"启动值"。

在我们的实现中，采用了以下策略来生成多步初值：

\subsection{使用单步方法生成初值}

使用可以针对需求使用单步方法（如四阶经典RK方法， 欧拉方法）来生成LMM需要的多步初值：

\begin{algorithmic}[1]
\Function{LMM::generateStartingValues}{$u_0$, $f$, $k$}
    \State $starter \gets $ 创建一个ClassicalRK实例
    \State $values \gets [u_0]$ \Comment{存储初值}
    \For{$i = 1$ \textbf{to} $s-1$}
        \State $starter$ 使用较小步长计算 $t_i$ 时刻的解 $u_i$
        \State $values$.append($u_i$)
    \EndFor
    \State \Return $values$
\EndFunction
\end{algorithmic}

具体而言，我们采用的是4阶精度的GLRK方法。

在实现时，我们特别注意了处理非线性方程求解的收敛性问题，包括设置最大迭代次数、收敛判断标准以及处理发散的情况，以确保算法的稳定性和可靠性。


\section{显式方法和隐式方法的实现区别}

在实现初值问题求解器时，显式方法和隐式方法在计算逻辑上有着明显的区别，这直接影响了它们的实现细节。

\subsection{显式方法的实现}

显式方法（如Adam-Bashforth、显式Runge-Kutta等）的特点是：下一步的解可以直接通过当前步及之前步的信息显式计算得到。其实现相对简单，主要步骤如下：

\begin{enumerate}
    \item 根据方法系数，直接计算下一步的解
    \item 不需要迭代求解，一步到位得到结果
    \item 算法实现直观，计算开销小
\end{enumerate}

以经典的四阶Runge-Kutta方法为例，其实现如下：

\begin{algorithmic}[1]
\Function{ClassicalRK::solve}{$u_0$, $f$}
    \State $h \gets $ 步长
    \State $u \gets u_0$ \Comment{初始值}
    \For{$n = 0$ \textbf{to} $N-1$}
        \State $k_1 \gets h \cdot f(u_n, t_n)$
        \State $k_2 \gets h \cdot f(u_n + k_1/2, t_n + h/2)$
        \State $k_3 \gets h \cdot f(u_n + k_2/2, t_n + h/2)$
        \State $k_4 \gets h \cdot f(u_n + k_3, t_n + h)$
        \State $u_{n+1} \gets u_n + (k_1 + 2k_2 + 2k_3 + k_4)/6$
    \EndFor
\EndFunction
\end{algorithmic}

\subsection{隐式方法的实现}

隐式方法（如BDF、Adams-Moulton、隐式Runge-Kutta等）的特点是：下一步的解需要通过求解一个非线性方程（组）来获得。这使得其实现更加复杂，通常需要迭代方法求解：

\begin{enumerate}
    \item 构建关于下一步解的方程
    \item 使用迭代方法（如Newton法、不动点迭代法）求解该方程
    \item 可能需要处理迭代不收敛的情况
    \item 实现更为复杂，计算开销更大
\end{enumerate}

以隐式Runge-Kutta方法为例，其实现通常涉及求解一个代数方程组：

\begin{algorithmic}[1]
\Function{IRK::solve}{$u_0$, $f$}
    \State $h \gets $ 步长
    \State $u \gets u_0$ \Comment{初始值}
    \State $s \gets $ 阶段数
    \For{$n = 0$ \textbf{to} $N-1$}
        \State 初始化 $Y_i \gets u_n$, $\tilde{Y_i} \gets u_n $ 对于 $i = 1, 2, \ldots, s$
        \While{未收敛}
            \For{$i = 1$ \textbf{to} $s$}
                \State $\tilde{Y_i} \gets u_n + h \sum_{j=1}^{s} a_{ij} f(Y_j, t_n + c_j h)$
            \EndFor
            \State $Y_i \gets \tilde{Y_i}$
            \State 检查收敛性
        \EndWhile
        \State $u_{n+1} \gets u_n + h \sum_{i=1}^{s} b_i f(Y_i, t_n + c_i h)$
    \EndFor
\EndFunction
\end{algorithmic}

对于线性多步法的隐式方法，比如Adams-Moulton方法公式为：

$$u_{n+1} = u_n + h \sum_{j=-1}^{k-2} \beta_j f(u_{n-j}, t_{n-j})$$

由于其隐式特性，每步计算都需要求解一个非线性方程。
我们采用了预测-校正器策略：首先可以使用Adams-Bashforth方法预测一个值，
然后用Adams-Moulton方法进行校正。这大大提高了迭代求解的效率。

在项目中，我们使用了不动点迭代法来求解隐式方程，这通常需要起始点在靠近解的位置，
由于方程的连续性，在一个较小的步长下，我们可以认为上一步的解是一个合理的起始点。
在实现中我们给定容忍误差和迭代上限，确保算法进行。

% ===========================================
\part{求解效果.}
\section{测试问题设置}

我们选择了两组不同的初值条件来测试所实现的求解方法：

\begin{enumerate}
    \item 初值1：
    \begin{align*}
        u(0) &= (0.994, 0, 0, 0, -2.00159, 0)^T \\
        \mu &= 0.012277471 \\
        t_1 &= 17.06521656015796
    \end{align*}
    
    \item 初值2：
    \begin{align*}
        u(0) &= (0.879779, 0, 0, 0, -0.379678, 0)^T \\
        \mu &= 0.012277471 \\
        t_1 &= 19.140540691377
    \end{align*}
\end{enumerate}

这两组初值分别对应了三体问题中的两种典型运动轨迹。

\section{几种代表性方法的求解效果比较}
此处选取的方法分别为 AdamsBashforth[4], BDF[3], ClassicalRK, GLRK[2], DormandPrince, 
分别代表了显隐式的线性多步法和显隐式的龙哥库塔方法以及自适应步长的龙哥库塔方法. 
在测试中我们使用步长(0.1 0.01 0.001)分别测试每个以上方法对于初值1和初值2的求解效果.

\subsection{不同步长对求解精度的影响}
\begin{figure}[htbp]
    \centering
    \begin{subfigure}[b]{0.32\textwidth}
        \centering
        \includegraphics[width=\textwidth]{../figures/AdamsBashforth_4__type1_step0.1.png}
        \caption{步长 $h=0.1$}
        \label{fig:ab-h01}
    \end{subfigure}
    \hfill
    \begin{subfigure}[b]{0.32\textwidth}
        \centering
        \includegraphics[width=\textwidth]{../figures/AdamsBashforth_4__type1_step0.01.png}
        \caption{步长 $h=0.01$}
        \label{fig:ab-h001}
    \end{subfigure}
    \hfill
    \begin{subfigure}[b]{0.32\textwidth}
        \centering
        \includegraphics[width=\textwidth]{../figures/AdamsBashforth_4__type1_step0.001.png}
        \caption{步长 $h=0.001$}
        \label{fig:ab-h0001}
    \end{subfigure}
    \caption{4阶AdamsBashforth方法的解轨迹 (初值1)}
    \label{fig:ab-stepsize}
\end{figure}

\begin{figure}[htbp]
    \centering
    \begin{subfigure}[b]{0.32\textwidth}
        \centering
        \includegraphics[width=\textwidth]{../figures/AdamsMoulton_4__type1_step0.1.png}
        \caption{步长 $h=0.1$}
        \label{fig:am-h01}
    \end{subfigure}
    \hfill
    \begin{subfigure}[b]{0.32\textwidth}
        \centering
        \includegraphics[width=\textwidth]{../figures/AdamsMoulton_4__type1_step0.01.png}
        \caption{步长 $h=0.01$}
        \label{fig:am-h001}
    \end{subfigure}
    \hfill
    \begin{subfigure}[b]{0.32\textwidth}
        \centering
        \includegraphics[width=\textwidth]{../figures/AdamsMoulton_4__type1_step0.001.png}
        \caption{步长 $h=0.001$}
        \label{fig:am-h0001}
    \end{subfigure}
    \caption{4阶AdamsMoulton方法的解轨迹 (初值1)}
    \label{fig:am-stepsize}
\end{figure}

\begin{figure}[htbp]
    \centering
    \begin{subfigure}[b]{0.32\textwidth}
        \centering
        \includegraphics[width=\textwidth]{../figures/ClassicalRK_type1_step0.1.png}
        \caption{步长 $h=0.1$}
        \label{fig:crk-h01}
    \end{subfigure}
    \hfill
    \begin{subfigure}[b]{0.32\textwidth}
        \centering
        \includegraphics[width=\textwidth]{../figures/ClassicalRK_type1_step0.01.png}
        \caption{步长 $h=0.01$}
        \label{fig:crk-h001}
    \end{subfigure}
    \hfill
    \begin{subfigure}[b]{0.32\textwidth}
        \centering
        \includegraphics[width=\textwidth]{../figures/ClassicalRK_type1_step0.001.png}
        \caption{步长 $h=0.001$}
        \label{fig:crk-h0001}
    \end{subfigure}
    \caption{ClassicalRK方法的解轨迹 (初值1)}
    \label{fig:crk-stepsize}
\end{figure}

\begin{figure}[htbp]
    \centering
    \begin{subfigure}[b]{0.32\textwidth}
        \centering
        \includegraphics[width=\textwidth]{../figures/GLRK_2__type1_step0.1.png}
        \caption{步长 $h=0.1$}
        \label{fig:gl-h01}
    \end{subfigure}
    \hfill
    \begin{subfigure}[b]{0.32\textwidth}
        \centering
        \includegraphics[width=\textwidth]{../figures/GLRK_2__type1_step0.01.png}
        \caption{步长 $h=0.01$}
        \label{fig:gl-h001}
    \end{subfigure}
    \hfill
    \begin{subfigure}[b]{0.32\textwidth}
        \centering
        \includegraphics[width=\textwidth]{../figures/GLRK_2__type1_step0.001.png}
        \caption{步长 $h=0.001$}
        \label{fig:gl-h0001}
    \end{subfigure}
    \caption{4解GLRK方法的解轨迹 (初值1)}
    \label{fig:gl-stepsize}
\end{figure}

\begin{figure}[htbp]
    \centering
    \begin{subfigure}[b]{0.32\textwidth}
        \centering
        \includegraphics[width=\textwidth]{../figures/DormandPrince_type1_step0.1.png}
        \caption{步长 $h=0.1$}
        \label{fig:dm-h01}
    \end{subfigure}
    \hfill
    \begin{subfigure}[b]{0.32\textwidth}
        \centering
        \includegraphics[width=\textwidth]{../figures/DormandPrince_type1_step0.01.png}
        \caption{步长 $h=0.01$}
        \label{fig:dm-h001}
    \end{subfigure}
    \hfill
    \begin{subfigure}[b]{0.32\textwidth}
        \centering
        \includegraphics[width=\textwidth]{../figures/DormandPrince_type1_step0.001.png}
        \caption{步长 $h=0.001$}
        \label{fig:dm-h0001}
    \end{subfigure}
    \caption{DormandPrince方法的解轨迹 (初值1)}
    \label{fig:dm-stepsize}
\end{figure}

我们比较图\ref{fig:ab-stepsize}和图\ref{fig:am-stepsize}中不同步长下的解轨迹, 我们可以看到
在步长为0.001时，AM方法已经收敛到一个周期的轨迹上，而AB方法仍然具有一定的累计误差，这展示出了
隐式方法在求解精度上有着更好的表现.

而在图\ref{fig:crk-stepsize}和图\ref{fig:gl-stepsize}中我们可以看到，在步长为0.001
时ClassicalRK方法和GLRK方法都收敛到了一个周期的轨迹上。但是
ClassicalRK方法在步长为0.1和0.01时解是发散的，我们可以注意到解的模在趋向无情；
而GLRK的稳定性较好，虽然在较大步长仍然无法收敛到正确解，但是对解的模长有较好的控制。

最后我们在图\ref{fig:dm-stepsize}中可以看到DormandPrince方法给定不同的初值都能很好的
收敛到一个周期的轨迹上，并从输出到结果我们发现最后的总点数差别不大，
说明在不同初始步长情况下都能收敛到最佳的步长，
展现出自适应步长方法在求解的稳定性和精度上都具有较好的表现.

\subsection{不同方法的求解效率比较}

为了比较不同数值方法的性能，我们固定步长为$h=0.001$，对比各种方法的求解结果和求解的耗时：

\begin{figure}[htbp]
\centering
\begin{minipage}{0.48\textwidth}
    \centering
    \caption{不同数值方法在求解初值1问题时的性能比较}
    \label{tab:performance1}
    \begin{tabular}{lccc}
        \toprule
        \textbf{方法} & \textbf{步长} & \textbf{时间(s)} & \textbf{步数} \\
        \midrule
        AB[4] & 0.1 & 0.000228 & 171 \\
        AB[4] & 0.01 & 0.002417 & 1707 \\
        AB[4] & 0.001 & 0.021799 & 17066 \\
        \midrule
        AM[4] & 0.1 & 0.000492 & 171 \\
        AM[4] & 0.01 & 0.002635 & 1707 \\
        AM[4] & 0.001 & 0.017417 & 17066 \\
        \midrule
        CRK & 0.1 & 0.000112 & 171 \\
        CRK & 0.01 & 0.000947 & 1707 \\
        CRK & 0.001 & 0.010371 & 17066 \\
        \midrule
        GLRK & 0.1 & 0.000355 & 171 \\
        GLRK & 0.01 & 0.001896 & 1707 \\
        GLRK & 0.001 & 0.012606 & 17066 \\
        \midrule
        DP & 0.1 & 0.000184 & 143 \\
        DP & 0.01 & 0.000187 & 143 \\
        DP & 0.001 & 0.000183 & 143 \\
        \bottomrule
    \end{tabular}
\end{minipage}\hfill
\begin{minipage}{0.48\textwidth}
    \centering
    \caption{不同数值方法在求解初值2问题时的性能比较}
    \label{tab:performance2}
    \begin{tabular}{lccc}
        \toprule
        \textbf{方法} & \textbf{步长} & \textbf{时间(s)} & \textbf{步数} \\
        \midrule
        AB[4] & 0.1 & 0.000261 & 192 \\
        AB[4] & 0.01 & 0.002435 & 1915 \\
        AB[4] & 0.001 & 0.024798 & 19141 \\
        \midrule
        AM[4] & 0.1 & 0.000614 & 192 \\
        AM[4] & 0.01 & 0.003942 & 1915 \\
        AM[4] & 0.001 & 0.023060 & 19141 \\
        \midrule
        CRK & 0.1 & 0.000119 & 192 \\
        CRK & 0.01 & 0.001155 & 1915 \\
        CRK & 0.001 & 0.010907 & 19141 \\
        \midrule
        GLRK & 0.1 & 0.000354 & 192 \\
        GLRK & 0.01 & 0.002077 & 1915 \\
        GLRK & 0.001 & 0.015582 & 19141 \\
        \midrule
        DP & 0.1 & 0.000257 & 214 \\
        DP & 0.01 & 0.000256 & 216 \\
        DP & 0.001 & 0.000255 & 219 \\
        \bottomrule
    \end{tabular}
\end{minipage}
\end{figure}

我们可以注意到：单步法的求解实现几乎和步长成反比，步长缩小10倍，计算时间增加10倍；
而线性多步法步长减少10倍，计算时间增加的幅度大约在5倍，这是因为前s步的计算可以经过多次复用，
我们可以预计到在步长足够小的情况下，线性多步法的计算时间会比单步法更快.

但是精度足够高的单步法可以在较大的步长下收敛到正确的解，
而线性多步法在较小的步长下仍然会有一定的误差，在运行时间上也没有优势。
具体的问题可以根据需求选取合适的IVP求解器

\section{不同的初值下方程的性质}

在针对同一个常微分方程给定不同的初值情况下，方程的性质也有所不同，
比如我们看AdamsBashforth[4]方法和GLRK[2]方法在求解初值2问题时的表现如图\ref{fig:ab2}和图\ref{fig:gl2}
所示，AB方法在求解初值问题2时给出0.001的步长解收敛到了一个周期的值，而GLRK方法只需要0.1的步长就能收敛
到正确的解轨迹。这说明了初值2求解更加稳定，同时两个方法的求解效果也有更大的差异。
\begin{figure}[htbp]
    \centering
    \begin{subfigure}[b]{0.32\textwidth}
        \centering
        \includegraphics[width=\textwidth]{../figures/AdamsBashforth_4__type2_step0.1.png}
        \caption{步长 $h=0.1$}
    \end{subfigure}
    \hfill
    \begin{subfigure}[b]{0.32\textwidth}
        \centering
        \includegraphics[width=\textwidth]{../figures/AdamsBashforth_4__type2_step0.01.png}
        \caption{步长 $h=0.01$}
    \end{subfigure}
    \hfill
    \begin{subfigure}[b]{0.32\textwidth}
        \centering
        \includegraphics[width=\textwidth]{../figures/AdamsBashforth_4__type2_step0.001.png}
        \caption{步长 $h=0.001$}
    \end{subfigure}
    \caption{4阶AdamsBashforth方法的解轨迹 (初值2)}
    \label{fig:ab2}
\end{figure}

\begin{figure}[htbp]
    \centering
    \begin{subfigure}[b]{0.32\textwidth}
        \centering
        \includegraphics[width=\textwidth]{../figures/GLRK_2__type2_step0.1.png}
        \caption{步长 $h=0.1$}
    \end{subfigure}
    \hfill
    \begin{subfigure}[b]{0.32\textwidth}
        \centering
        \includegraphics[width=\textwidth]{../figures/GLRK_2__type2_step0.01.png}
        \caption{步长 $h=0.01$}
    \end{subfigure}
    \hfill
    \begin{subfigure}[b]{0.32\textwidth}
        \centering
        \includegraphics[width=\textwidth]{../figures/GLRK_2__type2_step0.001.png}
        \caption{步长 $h=0.001$}
    \end{subfigure}
    \caption{4解GLRK方法的解轨迹 (初值2)}
    \label{fig:gl2}
\end{figure}

\section{结论.}
在本项目中，我们实现了多种常微分方程初值问题的数值解法，
包括线性多步法（Adams-Bashforth、Adams-Moulton、BDF）
和Runge-Kutta方法（经典RK4、Gauss-Legendre RK、Dormand-Prince），
并将它们应用于求解典型的三体问题。通过大量实验和分析，
我们得出以下几点结论：
\begin{itemize}
    \item 求解精度与步长关系: 对于所有方法，随着步长的减小，解的精度通常会提高。然而，不同方法在相同步长下表现出明显差异。在步长为0.001时，大多数方法都能收敛到周期性轨道，
    但在较大步长下，许多方法（尤其是显式方法）会出现明显的误差累积。
    \item 显式与隐式方法的比较: 隐式方法展现出更好的稳定性和精确性，即使在较大步长下，
    也能保持解的有界性，而显式方法在较大步长下容易出现解的发散。
    \item 自适应步长方法的优势: Dormand-Prince等嵌入式Runge-Kutta方法通过自适应控制步长，在保证精度的同时显著减少了计算量。无论初始步长如何设置，它都能自动调整到合适的步长，因此在求解效率和精度平衡方面表现出色。在我们的测试中，
    该方法仅需约200步就能达到其他方法需要数万步才能达到的精度。
\end{itemize}

根据我们的实验，给出关于求解器选择的建议：
\begin{itemize}
    \item 对于对精度要求不高但计算速度重要的情况，显式方法（如ClassicalRK）是合适的选择。
    \item 对于刚性问题或需要高精度长时间积分的情况，隐式方法（如GLRK）更为可靠。
    \item 对于需要求解的步数较大的情况，选用线性多步法（如AdamsMoulton）能有较高的求解效率。
    \item 在大多数实际应用中，自适应步长方法（如Dormand-Prince）能够提供最佳的精度和效率平衡，是首选方案。
\end{itemize}

总之，初值问题的数值解法没有放之四海而皆准的最优选择，
需要根据具体问题特性（如刚性、所需精度、计算资源限制等）来选择合适的方法。

\end{document}